GitHub issuesからScrapboxに移行するスクリプト
GitHub issuesからScrapboxに移行するスクリプトを雑に作って、700 issuesを一括で移行した。
使い方
必要なものをインストールしておく。
移行元GitHub issuesが書かれているGitリポジトリ内で、以下のコマンドを実行する。
$ node github-issues-to-scrapbox.mjs > scrapbox-page-data.json
300 issues区切りで、scrapbox-page-data-0.json, scrapbox-page-data-1.json...ファイルが生成される。
scrapbox-page-data.jsonをScrapboxにインポートしていく。
code: github-issues-to-scrapbox.mjs
import { writeFile } from "fs/promises";
import { $ } from "zx";
$.verbose = false;
const issues = JSON.parse(
await $gh issue list --state all --limit 1000000 --json title,number,createdAt,updatedAt,body,comments,state
)
// 古いissue順にScrapboxページ化させて、
// Scrapboxのページ一覧では新しいissueほど上に表示させる。
.reverse();
const pages = issues.map((issue) => {
// issueをScrapboxのページ化するテンプレート
const lines = `${issue.title}
${[
[${issue.state}],
issue.body.trim() || "(No description provided. )",
...issue.comments.map((comment) => comment.body.trim()),
].join("\n\n\n")}`
.replaceAll("\r", "")
.split("\n");
return {
title: lines0?.slice(0, 100) || #${issue.number}, created: Math.floor(new Date(issue.createdAt).getTime() / 1000),
updated: Math.floor(new Date(issue.updatedAt).getTime() / 1000),
lines,
};
});
const chunkSize = 300;
const chunks = Array.from(
{ length: Math.ceil(pages.length / chunkSize) },
(_, index) => pages.slice(index * chunkSize, (index + 1) * chunkSize)
);
await writeFile(
scrapbox-page-data-${index}.json,
JSON.stringify({ pages: chunk })
);
}